﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Itfort.Tasks
{
	/// <summary>
	/// 任务运行器。
	/// </summary>
	public class TaskRunner
	{
		ITask m_task;
		bool m_isRunning = false;

		/// <summary>
		/// 
		/// </summary>
		/// <param name="task"></param>
		public TaskRunner(ITask task)
		{
			if (task == null)
			{
				throw new NullReferenceException("构造TaskRunner时，类型为ITask的task参数不能为空。");
			}
			m_task = task;

			this.Name = Guid.NewGuid().ToString();
			this.StartTime = new TimeSpan(0, 0, 0);
			this.EndTime = new TimeSpan(24, 0, 0);
			this.Interval = new TimeSpan(0, 1, 0);
		}

		/// <summary>
		/// 任务名称。
		/// </summary>
		public string Name { get; set; }

		/// <summary>
		/// 开始时间。
		/// </summary>
		public TimeSpan StartTime { get; set; }

		/// <summary>
		/// 结束时间。
		/// </summary>
		public TimeSpan EndTime { get; set; }

		/// <summary>
		/// 间隔时间
		/// </summary>
		public TimeSpan Interval { get; set; }

		/// <summary>
		/// 最后运行时间。
		/// </summary>
		public DateTime LastRunTime { get; set; }

		/// <summary>
		/// 获取一个值，该值表示任务是否允许运行。
		/// </summary>
		public bool CanRun()
		{
			if (m_isRunning) return false;
			if (DateTime.Now - LastRunTime < Interval) return false;
			var timeOfDay = DateTime.Now.TimeOfDay;
			if (timeOfDay < StartTime) return false;
			if (timeOfDay > EndTime) return false;
			return true;
		}

		/// <summary>
		/// 运行任务。
		/// </summary>
		public void Run()
		{
			if (!this.CanRun())
			{
				return;
			}

			m_task.Run();

			// 设置最后运行时间
			this.LastRunTime = DateTime.Now;
		}
	}
}
